UnityTestについて
概要
AssetStoreにある、UnityのTestToolっぽいもの。
実際にはなんなんだろう?
実機だとどう動作するんだろう?
これは何?
Assertion、
Assertion Componentってのがあってイイ、、とおもうんだけど、うんまあ、、はい、、
Unity使ってて不満だったのが、デフォルトのAssertionメソッドが無かった事。
gameObjectに対してセットするComponentとして、条件を指定する形式の実装がなされている。
Componentとして実装されているので、コードベースでやるよりも
・いつのチェックか
・何と比べるか
が、いろいろセットできてよい。
Assertionがそこかしこに書かれるよりはいい、、のかなあ。
ちょっと解んないよ。
Assertionすると実際どうなるの? AssertionのExampleを実行してみる
Assetを入れてみると、Exampleが2つ入っているので、見てみる。
AssertionExampleScene.unity を開いてプレイすると、
ボールが画面奥に転がっていって下記Assertion fail の群が出る。
AssertionException: Sphere assertion failed.
(Sphere (UnityEngine.GameObject)).gameObject.renderer CompareToObject (Main Camera (UnityEngine.GameObject)).Camera failed.
UnityEngine.Debug:LogException(Exception, Object)
UnityTest.Assertions:CheckAssertions(AssertionComponent[]) (at Assets/UnityTestTools/Assertions/Assertions.cs:61)
UnityTest.Assertions:CheckAssertions(AssertionComponent) (at Assets/UnityTestTools/Assertions/Assertions.cs:16)
UnityTest.AssertionComponent:CheckAssertionFor(CheckMethod) (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:260)
UnityTest.AssertionComponent:Update() (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:156)
Sphereとcameraに関するassertion fail
AssertionException: Sphere assertion failed.
(Sphere (UnityEngine.GameObject)).Transform.position.y CompareToObject (Plane (UnityEngine.GameObject)).Transform.position.y failed.
UnityEngine.Debug:LogException(Exception, Object)
UnityTest.Assertions:CheckAssertions(AssertionComponent[]) (at Assets/UnityTestTools/Assertions/Assertions.cs:61)
UnityTest.Assertions:CheckAssertions(AssertionComponent) (at Assets/UnityTestTools/Assertions/Assertions.cs:16)
UnityTest.AssertionComponent:CheckAssertionFor(CheckMethod) (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:260)
UnityTest.AssertionComponent:FixedUpdate() (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:162)
SphereとPlaneのposition.yに関するassertion fail
これらは、SphereのInspector上で、コンポーネントとしてセットしてあった。
Sphereのコンポーネントに下記2つのAssertion設定がある。
なるほどなー。SphereとMain Cameraとか、SphereとPlaneを比較して、
それぞれのプロパティの何がどうなったらダメ、とかを指定できる形。
Assertionのバリエーションはこんな感じ
何を比較するか
いつ比較するか
試しに、SphereにSphereScript.csというスクリプトを新たにくっつけて、
パブリックなVector3のパラメータ myVector3 を実装してみたうえで、
Sphereにアタッチ + AssertionComponentを付け加えたところ、
確かに、SphereScript.myVector をターゲットに指定して、Nullじゃないよね!? みたいなチェックができる。
で、実行してみると、
チェックのタイミングをStart時にしたので、もちろんNullなmyVecotrのAssertionは失敗、下記が出た。
ArgumentException: Null was passed to a value-type argument
UnityTest.ComparerBaseGeneric`2[UnityEngine.Vector3,UnityEngine.Vector3].Compare (System.Object a, System.Object b) (at Assets/UnityTestTools/Assertions/Comparers/ComparerBase.cs:113)
UnityTest.ComparerBase.Compare (System.Object objVal) (at Assets/UnityTestTools/Assertions/Comparers/ComparerBase.cs:44)
UnityTest.ActionBase.Compare () (at Assets/UnityTestTools/Assertions/Comparers/ActionBase.cs:30)
UnityTest.Assertions.CheckAssertions (UnityTest.AssertionComponent[] assertions) (at Assets/UnityTestTools/Assertions/Assertions.cs:32)
UnityTest.Assertions.CheckAssertions (UnityTest.AssertionComponent assertion) (at Assets/UnityTestTools/Assertions/Assertions.cs:16)
UnityTest.AssertionComponent.CheckAssertionFor (CheckMethod checkMethod) (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:260)
UnityTest.AssertionComponent.Start () (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:103)
インスペクタは別途あり、そこから一覧をみることができる。
適当なIdentityになりうる文字列とかを入れさせてほしいなーっ、、て思うが。
Assertion感
Good:
オブジェクトに対して制約を付けられる
タイミング系とかを細かくセットできるのはうれしいなって。
Bad:
AssertionのIdentityが付けられない。
コメントはそれ単体でエラーにならないので否だけど、
自分は「このAssertionに失敗するってことはこういう不味いことが起こってるんだぜ」とかを、Assertion失敗時に表示したいなー。
たとえば、
Assert(0 < A.transform.position.z, "一瞬たりともAのz位置が0とかマイナスなんてありえない!!" );
みたいに書きたい。
Assertion Fail 時には、
Assertion Failed: "一瞬たりともAのz位置が0とかマイナスなんてありえない!!"とか出したい。
これはComponent上でセットできても良いと思うんだけどなー。
つづきはまた今度書く。